#ifndef _CLFILE_H_
#define _CLFILE_H_

#include <fcntl.h>
#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

class CLFile
{
public:
	CLFile();
	~CLFile();
	
	int Open(const char *pathname, int flags);    // open的包裹函数，封装打印信息和错误处理信息
	off_t Lseek(off_t offset, int whence);   // lseek的包裹函数，封装打印信息和错误处理信息
	ssize_t Read(void *buf, size_t count);   // read的包裹函数，封装了含读写缓存的处理过程
	ssize_t Write(const void *buf, size_t count); // write的包裹函数，封装了含读写缓存的处理过程
	int Close();
	
	void updateReadBuffer();   // 更新ReadBuffer的操作
	void flushWriteBuffer();   // 刷新WriteBuffer的操作
private:
	
	int noReadBuffer;        // 标志位：表示没有创建read_buffer
	int noWriteBuffer;       // 标志位：表示没有创建write_buffer
	int isAppend;            // 标志位：表示是否是Append打开文件方式（O_APPEND 和非O_APPEND的写操作有很大不同）

	int mFd;                 // 记录当前文件描述符
	off_t curPos;            // 记录当前文件偏移量
	
	/*
	readBuffer相关：
	--------------------------
	|            |           |
	--------------------------
	readBegin表示读缓存对应的起始文件偏移量
	readEnd表示读缓存对应的末尾文件偏移量
	readPosition表示读缓存中的上次读到的文件偏移量
	*/
	char *readBuffer;
	off_t readBegin;
	off_t readEnd;
	off_t readPosition;
	
	/*
	writeBuffer相关：
	-------------------------
	|           |            |
	-------------------------
	writeBegin表示写缓存对应的起始文件偏移量
	writeEnd表示写缓存可以对应的最大文件偏移量
	writePosition表示对应的写缓存已写到的文件偏移量
	*/
	char *writeBuffer;
	off_t writeBegin;
	off_t writeEnd;
	off_t writePosition;
	
};

#endif